package com.raler.proyar.il.interfaces;

import java.io.Serializable;
import java.util.List;

import com.raler.proyar.il.exception.GeneralDAOException;
import com.raler.proyar.il.model.GeneralDomainObject;

public interface GeneralDAO<E extends GeneralDomainObject> {

	/**
	 * 
	 * Inserte la entidad indicada en el contexto de persistencia.
	 * 
	 * @param entity
	 *            Entidad a insertar.
	 * @return La entidad indicada.
	 * @throws GeneralDAOException
	 *             En caso de producirse un error en la persistencia.
	 */
	E insert( E entity ) throws GeneralDAOException;

	/**
	 * 
	 * Fusiona los cambios con la entidad en el contexto de persistencia.
	 * 
	 * @param entity
	 *            Entidad a fusionar.
	 * @return La entidad del contexto de persistencia.
	 * @throws GeneralDAOException
	 *             En caso de producirse un error en la persistencia.
	 */
	E update( E entity ) throws GeneralDAOException;

	/**
	 * 
	 * Elimina la entidad del contexto de persistencia.
	 * 
	 * @param entity
	 *            Entidad a eleminar.
	 * @throws GeneralDAOException
	 *             En caso de producirse un error en la persistencia.
	 */
	void remove( E entity ) throws GeneralDAOException;

	/**
	 * 
	 * Busca la entidad de tipo E por su id.
	 * 
	 * @param id
	 *            Identificador de la entidad.
	 * @return La entidad encontrada.
	 * @throws GeneralDAOException
	 *             En caso de producirse un error en la persistencia.
	 */
	E findById( final Serializable id ) throws GeneralDAOException;

	/**
	 * 
	 * Persiste las entidades indicadas.
	 * 
	 * @param entities
	 *            Entidades a guardar.
	 * @return La lista de entidades.
	 * @throws GeneralDAOException
	 *             En caso de producirse un error en la persistencia.
	 */
	List<E> insert( List<E> entities ) throws GeneralDAOException;

	/**
	 * 
	 * Fusiona los cambios en las entidades indicadas con las presentes en el contexto de persistencia.
	 * 
	 * @param entities
	 *            Entidades a fusionar.
	 * @return Las entidades del contexto de persistencia.
	 * @throws GeneralDAOException
	 *             En caso de producirse un error en la persistencia.
	 */
	List<E> update( List<E> entities ) throws GeneralDAOException;

	/**
	 * 
	 * Recupera todas las entidades de tipo <E>
	 * 
	 * @return
	 * @throws GeneralDAOException
	 * @see com.unav.pdocente.il.dal.interfaces.GeneralDAO#findAll()
	 */
	List<E> findAll() throws GeneralDAOException;

}
